class FireBall extends AcGameObject {
    // 构造函数，初始化火球对象
    constructor(playground, player, x, y, radius, vx, vy, color, speed, move_length, damage) {
        super(); // 调用父类构造函数
        this.playground = playground; // 游戏场地
        this.player = player; // 玩家对象
        this.ctx = this.playground.game_map.ctx; // 获取绘图上下文
        this.x = x; // 火球初始x坐标
        this.y = y; // 火球初始y坐标
        this.vx = vx; // 火球水平速度
        this.vy = vy; // 火球垂直速度
        this.radius = radius; // 火球半径
        this.color = color; // 火球颜色
        this.speed = speed; // 火球移动速度（每秒）
        this.move_length = move_length; // 火球需要移动的总长度
        this.damage = damage;//火球的伤害
        this.eps = 0.01; // 一个很小的值，用于判断移动长度是否接近0
    }

    // 开始方法，可以重写用于初始化动作
    start() {

    }

    // 更新方法，每一帧都会调用
    update() {
        // 如果剩余移动长度小于eps，则认为火球已到达目的地，销毁火球并返回false
        if (this.move_length < this.eps) {
            this.destroy();
            return false;
        }

        this.update_move();
        if (this.player.character !== "enemy") {
            this.update_attack();
        }

        // 渲染火球
        this.render();
    }

    update_move() {
        // 计算当前帧实际移动的距离，不超过剩余移动长度和根据速度计算出的距离
        let moved = Math.min(this.move_length, this.speed * this.timedelta / 1000);
        //更新火球位置
        this.x += this.vx * moved;
        this.y += this.vy * moved;
        // 更新剩余移动长度
        this.move_length -= moved;
    }

    update_attack(){
        // 遍历所有玩家，检查是否发生碰撞
        for (let i = 0; i < this.playground.players.length; i++) {
            let player = this.playground.players[i];
            // 如果当前火球不是由该玩家发射，并且发生碰撞
            if (this.player !== player && this.is_collision(player)) {
                // 对玩家进行攻击
                this.attack(player);
                break;
            }
        }
    }

    // 计算两点之间的距离
    get_dist(x1, y1, x2, y2) {
        let dx = x1 - x2;
        let dy = y1 - y2;
        return Math.sqrt(dx * dx + dy * dy);
    }


    // 检查火球是否与玩家发生碰撞
    is_collision(player) {
        // 计算火球与玩家之间的距离
        let distance = this.get_dist(this.x, this.y, player.x, player.y);
        // 如果距离小于火球半径与玩家半径之和，则发生碰撞
        if (distance < this.radius + player.radius)
            return true;
        return false;
    }

    // 对玩家进行攻击
    attack(player) {
        // 计算火球到玩家的角度
        let angle = Math.atan2(player.y - this.y, player.x - this.x);
        // 玩家被攻击，传入攻击角度和伤害值
        player.is_attacked(angle, this.damage);

        if (this.playground.mode === "multi mode") {
            this.playground.mps.send_attack(player.uuid, player.x, player.y, angle, this.damage, this.uuid);
        }

        // 销毁火球
        this.destroy();
    }

    // 渲染方法，用于绘制火球
    render() {
        let scale = this.playground.scale;
        // 开始绘制路径
        this.ctx.beginPath();
        // 绘制圆形，圆心为(this.x, this.y)，半径为this.radius，乘一个scale是保证resize时大小是相对的
        this.ctx.arc(this.x * scale, this.y * scale, this.radius * scale, 0, Math.PI * 2, false);
        // 设置填充颜色
        this.ctx.fillStyle = this.color;
        // 填充路径
        this.ctx.fill();
    }

    on_destroy() {
        let fireballs = this.player.fireballs;
        for (let i=0; i < fireballs.length; i++) {
            if (fireballs[i] === this) {
                fireballs.splice(i, 1);
                break;
            }
        }
    }
}
